package com.dc.designPattern._18_memento.impl;

import org.junit.Test;

/**
 * Description: 备忘录模式_客户端
 * @author: gdc
 * @date: 2021/6/4
 * @version 1.0
 */
public class Client {

    /**
     * 测试保存一个状态
     */
    @Test
    public void testOne(){
        GameRole gameRole = new GameRole("战士", 100, 200);

        System.out.println("和 boss 大战前的状态：");
        gameRole.display();

        // 保存当前的状态
        Caretaker caretaker = new Caretaker();
        caretaker.setMemento(gameRole.createMemento());

        System.out.println("和 boss 大战~~~");
        gameRole.setVit(120).setDef(80);
        gameRole.display();

        System.out.println("大战后，使用备忘录对象恢复到战前");

        gameRole.recoverGameRoleFromMemento(caretaker.getMemento());
        gameRole.display();
    }

    /**
     * 测试保存多个状态
     */
    @Test
    public void testList(){
        GameRole gameRole = new GameRole("战士", 100, 200);

        System.out.println("和 boss 大战前的状态：");
        gameRole.display();

        // 保存当前的状态
        Caretaker caretaker = new Caretaker();
        caretaker.addMemento(gameRole.createMemento());

        System.out.println("和 boss 大战，第一回合~~~");
        gameRole.setVit(160).setDef(80);
        gameRole.display();
        caretaker.addMemento(gameRole.createMemento());

        System.out.println("和 boss 大战，第二回合~~~");
        gameRole.setVit(130).setDef(60);
        gameRole.display();
        caretaker.addMemento(gameRole.createMemento());

        System.out.println("和 boss 大战，第三回合~~~");
        gameRole.setVit(110).setDef(50);
        gameRole.display();
        caretaker.addMemento(gameRole.createMemento());

        System.out.println("大战后，使用备忘录对象恢复到第一回合状态");

        gameRole.recoverGameRoleFromMemento(caretaker.getMementoByIndex(1));
        gameRole.display();
    }

    /**
     * 测试保存多个角色的多个状态
     */
    @Test
    public void testMap(){
        GameRole gameRole = new GameRole("战士", 100, 200);

        System.out.println("战士 和 boss 大战前的状态：");
        gameRole.display();

        Caretaker caretaker = new Caretaker();
        caretaker.addMementoByRole("战士", gameRole.createMemento());

        System.out.println("战士 和 boss 大战，第一回合~~~");
        gameRole.setVit(90).setDef(160);
        gameRole.display();
        caretaker.addMementoByRole("战士", gameRole.createMemento());

        System.out.println("战士 和 boss 大战，第二回合~~~");
        gameRole.setVit(70).setDef(140);
        gameRole.display();
        caretaker.addMementoByRole("战士", gameRole.createMemento());

        System.out.println("战士 和 boss 大战，第三回合~~~");
        gameRole.setVit(50).setDef(80);
        gameRole.display();
        caretaker.addMementoByRole("战士", gameRole.createMemento());

        // ------------------------------------------------------------------------

        System.out.println("\n法师 和 boss 大战前法师的状态：");
        GameRole gameRole2 = new GameRole("法师", 180, 100);
        gameRole2.display();
        caretaker.addMementoByRole("法师", gameRole2.createMemento());

        System.out.println("法师 和 boss 大战，第一回合~~~");
        gameRole2.setVit(150).setDef(80);
        gameRole2.display();
        caretaker.addMementoByRole("法师", gameRole2.createMemento());

        System.out.println("法师 和 boss 大战，第二回合~~~");
        gameRole2.setVit(130).setDef(60);
        gameRole2.display();
        caretaker.addMementoByRole("法师", gameRole2.createMemento());


        System.out.println("\n大战后，使用备忘录对象恢复 战士角色到初始状态");
        gameRole.recoverGameRoleFromMemento(caretaker.getRoleMementoByIndex("战士", 0));
        gameRole.display();

        System.out.println("\n大战后，使用备忘录对象恢复 法师角色到初始状态");
        gameRole.recoverGameRoleFromMemento(caretaker.getRoleMementoByIndex("法师", 0));
        gameRole.display();

    }
}
